package service

import (
	"errors"
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"ksd-social-api/commons/jwttoken"
	"ksd-social-api/modules/login/mapper"
	"ksd-social-api/modules/login/model/context"
	"ksd-social-api/modules/login/model/vo"
	mapper2 "ksd-social-api/modules/user/mapper"
	"ksd-social-api/modules/user/model"
	"ksd-social-api/utils"
	"time"
)

type LoginService struct{}

var loginMapper = mapper.LoginMapper{}
var userMapper = mapper2.UserMapper{}

/**
 * @author feige
 * @date 2023-09-29
 * @desc 登录接口 - 根据手机号码查询用户信息
 */
func (service *LoginService) LoginByTelePhone(ctx *context.LoginPasswordContext) (o *vo.LoginVo, err error) {
	// 1: 根据手机号码查询用户
	user, err := loginMapper.LoginByTelePhone(ctx.Telephone)
	// 2: 根据用户账号去数据库中查询用户是否存在，存在就返回用户信息，不存在就说明：输入的账号和密码有误
	if user == nil {
		return nil, errors.New("找不到用户信息!!!")
	}
	// 3: 根据输入密码和用户数据库查询密码。进行比对，如果相同，就代表登录成功，如果不同输入的账号和密码有误
	md5Password := utils.Md5Slat(ctx.Password, user.Uuid)
	if user.Password != md5Password {
		return nil, errors.New("输入账号和密码有误!!!")
	}
	// 4: 开始把登录的用户信息，生成token进行返回
	loginVo := vo.LoginVo{}
	loginVo.UserId = user.ID
	//用于以后得挤下线功能
	loginVo.Uuid = utils.GetUUID()
	// 生成一个token
	token, _ := service.createToken(user)
	loginVo.Token = token
	return &loginVo, nil
}

func (service *LoginService) LoginByTelePhoneCode(ctx *context.LoginCodeContext) (o *vo.LoginVo, err error) {
	// 1: 根据手机号码查询用户
	user, err := loginMapper.LoginByTelePhone(ctx.Telephone)
	// 2: 根据用户账号去数据库中查询用户是否存在，存在就返回用户信息，不存在就说明：输入的账号和密码有误
	if user == nil {
		// 如果不存在，就注册一个用户
		dbUser := model.User{}
		dbUser.Telephone = ctx.Telephone
		dbUser.UserName = "XK"
		dbUser.Avatar = "default.png"
		dbUser.Male = 2
		dbUser.Uuid = utils.GetUUID()
		dbUser.Active = 1
		dbUser.Sign = "Ta什么都没留下!"
		dbUser.Forbidden = 0
		dbUser.IsDelete = 0
		dbUser.BgImg = "bg.jpg"
		user = userMapper.SaveUser(dbUser)
	}

	// 4: 开始把登录的用户信息，生成token进行返回
	loginVo := vo.LoginVo{}
	loginVo.UserId = user.ID
	loginVo.Uuid = utils.GetUUID()
	// 生成一个token
	token, _ := service.createToken(user)
	loginVo.Token = token
	return &loginVo, nil

}

/*
* 根据用户信息创建一个token
 */
func (service *LoginService) createToken(user *model.User) (string, error) {
	// 设置token续期的缓冲时间
	bf, _ := utils.ParseDuration("1d")
	ep, _ := utils.ParseDuration("7d")
	// 1: jwt生成token
	myJwt := jwttoken.NewJWT()
	// 2: 生成token
	token, err2 := myJwt.CreateToken(jwttoken.CustomClaims{
		user.ID,
		user.UserName,
		user.Avatar,
		int64(bf / time.Second),
		jwt.StandardClaims{
			Audience:  "KSD",                        // 受众
			Issuer:    "KSD-ADMIN",                  // 签发者
			IssuedAt:  time.Now().Unix(),            // 签发时间
			NotBefore: time.Now().Add(-1000).Unix(), // 生效时间
			ExpiresAt: time.Now().Add(ep).Unix(),    // 过期时间
		},
	})

	fmt.Println("当前时间是：", time.Now().Unix())
	fmt.Println("缓冲时间：", int64(bf/time.Second))
	fmt.Println("签发时间：" + time.Now().Format("2006-01-02 15:04:05"))
	fmt.Println("生效时间：" + time.Now().Add(-1000).Format("2006-01-02 15:04:05"))
	fmt.Println("过期时间：" + time.Now().Add(ep).Format("2006-01-02 15:04:05"))

	if err2 != nil {
		return "", err2
	}

	return token, nil
}
